Ana içeriğe geç
  1. 100 Günde SwiftUI Notları/

3.Gün - Swift Kompleks Veri Tipleri : Array, Dictionary, Set, ve Enum

Bu bölümde; Array, Dictionary, Set ve Enum gibi complex data tiplerini inceleyeceğiz.

Swift Array #

Array’ler bir veri tipidir, tıpkı String, Int, Double gibi. Amaç bir çok veriyi düzenli ve sıralı olarak tek bir yerde tutmaktır. Dizideki veri tiplerinin hepsi aynıdır. Diziler köşeli parantez ([) ile oluşturulurlar ve her bir öğe virgül (,) ile birbirinden ayrılır. Örnek olarak Array’ler oluşturalım;

var beatles = ["John", "Paul", "George", "Ringo"]
let numbers = [4, 8, 15, 16, 23, 42]
var temperatures = [25.3, 28.2, 26.4]

Bir Array’den veri okumak istediğimizde, okumak istediğimiz verinin sıra numarası olan index ile veriyi çağırabiliriz.

Array’lerin index numarası 0’dan başlar. Yani dizinin ilk elemanın index numarası 0’dır.

print(beatles[0])      //ÇIKTI: John
print(numbers[1])      //ÇIKTI: 8
print(temperatures[2]) //ÇIKTI: 26.4

Boş Array Tanımlanması #

Swift Type Safety (Tip Güvenilir) bir dil olduğundan Array’in hangi tür veri tuttuğunu her zaman bilmek zorundadır. Eğer biz başlangıç verileri ile bir Array oluşturursak Swift bunun hangi tür olduğunu bilebilir. Fakat boş bir Array oluşturup daha sonra verilerini dolduracaksak, Array’in oluşma aşamasında mutlaka türünü belirlemeliyiz. Array’de tür belirleme işlemi 2 şekilde yapılabilir.

1.Yol

//String türünde boş bir Array oluşturur.
var albums = Array<String>()

2.Yol

//String türünde boş bir Array oluşturur.
var albums = [String]()

Bazı Array Fonksiyonları #

.append() #

Değişken bir Array tanımlaması yapıldıysa bu fonksiyonu kullanabilirsiniz. Örneğin beatles Array’ı var olarak tanımlandığı için bu fonksiyon kullanılabilirken, let ile tanımlanan numbers Array’ine yeni veri eklenememektedir.

beatles.append("Allen")
beatles.append("Adrian")
beatles.append("Novall")
beatles.append("Vivian")

Ayrıca dizi ilk olarak hangi türde tanımlandıysa (String, Double, Int) daha sonra eklenecek veri de o türde olmalıdır.

Örneğin aşağıdaki kod hatalıdır, çünkü temperatures Array’ı Double türünde olduğundan String bir veri eklenemez.

//BU KOD HATALIDIR.
temperatures.append("Chris")

.count() #

Daha önce String’lerde de gördüğümüz count() fonksiyonu ile, bir Array’de kaç adet öğe olduğunu öğrenebiliriz.

print(beatles.count) 
//ÇIKTI: 4

.remove(at:) ve .removeAll() #

remove(at:) fonksiyonu ile belirli bir index’teki Array öğesini silebiliriz.

removeAll() fonksiyonu ile de Array’de bulunan bütün öğeler silinir.

var characters = ["Lana", "Pam", "Ray", "Sterling"]
print(characters.count) //ÇIKTI: 4

characters.remove(at: 2)
print(characters.count) //ÇIKTI: 3

characters.removeAll()
print(characters.count) //ÇIKTI: 0

.contains() #

contains() fonksiyonu ile aradığımız öğenin Array’de var olup olmadığı kontrol eder. Varsa true , yoksa false değeri geri döner.

let bondMovies = ["Casino Royale", "Spectre", "No Time To Die"]
print(bondMovies.contains("Frozen")) 
//ÇIKTI: false

.sorted() #

Uygulandığı Array’in artan olarak sıralanmış halini geri döndürür. Orijinal dizi değişmeden kalır.

let cities = ["London", "Tokyo", "Rome", "Budapest"]
print(cities.sorted())
//ÇIKTI: ["Budapest", "London", "Rome", "Tokyo"]

.reversed() #

Bir Array’i reversed() fonksiyonu ile tersine çevirebiliriz.

let presidents = ["Bush", "Obama", "Trump", "Biden"]
let reversedPresidents = presidents.reversed()
print(reversedPresidents)
//ÇIKTI: ReversedCollection<Array<String>>(_base: ["Bush", "Obama", "Trump", "Biden"])

Swift Dictionary #

Array’ler ile çalışırken verilerin belirli bir sırada olması gerektiğinden bahsetmiştik. Bu da şu sorunu ortaya çıkarıyor: karışık bir veri grubuna sahip olduğumuzu bunu Array’e kaydettiğimizi düşünelim. Bu Array’den bir veriyi çekip kullanmak istediğimizde, verinin index numarasını kesinlikle bilmemiz gerekiyor. Peki ya aradan bir veri silindiyse ve aradığımız index numarası değiştiyse? İşte yine bir problem.

Array’deki bu problemi ortadan kaldırmak için Dictionary tipi imdadımıza yetişiyor. Dictionary’de veri belirli bir sırada tutulmaz. Veri Key-Value ikilisi olarak tutulmaktadır. Bu sayede aradığımız verinin Key’ini vererek istediğimiz veriye ulaşabiliriz.

let employee2 = [
    "name": "Taylor Swift",
    "job": "Singer", 
    "location": "Nashville"
]

Yukarıdaki Dictionary’de name,job ve location key olarak adlandırılır.

Taylor Swift , Singer ve Nashville ise value

Bir Dictionary’den bir veri okumak istediğimizde, key i vermemiz yeterlidir.

print(employee2["name"]) //ÇIKTI: Optional("Taylor Swift")
print(employee2["job"]) //ÇIKTI: Optional("Singer")
print(employee2["location"]) //ÇIKTI: Optional("Nashville")

Swift’in yukarıda vermiş olduğu çıktıları incelediğimizde Optional olarak işaretlendiğini görürüz. Bu konuyu daha sonra irdeleyeceğiz fakat bu durumun nedeni Swift’in kodumuza güvenli bir şekilde yaklaşmak istemesinden kaynaklanıyor. Çünkü key ‘i yanlış yazmış olabilir yada böyle bir key hiç olmamış olabilir. Şimdilik bu hatayı almamak için default anahtar kelimesini kullanacağız.

print(employee2["name", default: "Unknown"]) //ÇIKTI: Taylor Swift
print(employee2["job", default: "Unknown"]) //ÇIKTI: Singer
print(employee2["location", default: "Unknown"]) //ÇIKTI: Nashville

Bu sayede Swift’e şunu demiş oluyoruz: “Hey işte sana default bir değer, eğer istediğim key Dictionary’de yoksa bana geriye default değeri ver.” Bu sayede geriye kesinlikle bir değer döneceğinden emin olduğumuzdan Swift çıktıyı optional olarak işaretlemeyecektir.

Boş Dictionary Tanımlanması #

Daha önce Array’de yaptığımız gibi boş olarak Dictionary tanımlamasını yapabiliriz.

Aşağıdaki örnekte görüldüğü üzere key String olarak, value ise Int olarak belirlenmiştir.

var heights = [String:Int]()
heights["Yao Ming"] = 229
heights["Shaquille O'Neal"] = 216
heights["LeBron James"] = 206

Herhangi bir key ‘e veri eklemek istediğinizde, o key daha önceden kullanılmamışsa veri eklenir. Fakat daha önceden o key varsa key’in tuttuğu value değiştirilir.

Array’lerde gördüğümüz count() ve removeAll() fonksiyonları da aynı şekilde Dictionary’lerde de kullanılabilmektedir.

Swift Set #

Set’lerin özelliği, veriler sıralı olarak tutulmaz ve her bir veriden sadece 1 tane bulunabilir.

Set ifadeler aşağıdaki gibi oluşturulabilir.

let people = Set(["Denzel Washington", 
					"Tom Cruise", 
				    "Nicolas Cage", 
					"Samuel L Jackson",
					"Denzel Washington"])

Yukarıdaki örneğe dikkat ettiyseniz, önce bir Array oluşturulur ardından bu Array Set’e dönüştürülür. Set verilen Array’deki yinelenen verileri kaldıracaktır.

print(people)
//ÇIKTI: ["Samuel L Jackson", "Denzel Washington", "Tom Cruise", "Nicolas Cage"]

print(people) çıktısını incelediğimizde, sıralamanın değiştiğini ve 2 kez yazılan Denzel Washington ‘un 1 kez yazıldığına dikkat edin.

Boş Set Tanımlaması #

Array ve Dictionary de yaptığımız gibi boş Set, aşağıdaki örnekte görüldüğü gibi oluşturulabilir.

var people = Set<String>()
people.insert("Denzel Washington")
people.insert("Tom Cruise")
people.insert("Nicolas Cage")
people.insert("Samuel L Jackson")

Set’lere yeni veri eklemek istendiğinde insert() fonksiyonu kullanılır. Set’lerde append() fonksiyonu kullanılmaz, çünkü Set’ler Array’ler gibi sıralı veri tutmazlar.

contains() fonksiyonu Set’in içinde aradığımız verinin olup olmadığını kontrol edebilir.

count fonksiyonu Set’teki veri sayısını döndürür.

sorted() fonksiyonu Set’in sıralanmış halini geri döndürebilir.

Set’in Avantajları #

  1. Bazen elimizdeki verilerde tekrarlanan verilere ihtiyacımız olmayabilir. Set’ler bu noktada imdadımıza yetişiyor ve Array’den Set’i oluştururken tekrarlanan veriyi kaydetmiyor. Yani Set’lerin içindeki verinin benzersiz olduğuna emin olabiliyoruz.
  2. Set’lerde tutulan veriler hızlı bulunabilecek şekilde sırasız ve optimize edilmiş halde bulunur. Bu sayede çok elemanlı bir Set’de contains() gibi bir fonksiyon kullanarak, istediğimiz verinin Set’in içinde bulunup bulunmadığını çok hızlı bir şekilde kontrol edebiliriz.

Swift Enumeration #

Enum ifadeler esasında isimlendirilmiş değerlerdir. Fakat String kullanmaktan daha verimli ve güvenlidir. Diyelim ki, haftanın günlerinden birini seçeceğiz:

var selected = "Monday"

Ardından bu seçimi değiştireceğiz;

selected = "Tuesday"

Ardından bir kez daha değiştireceğiz;

selected = "Friday "

Fark ettiyseniz son değişimde günü yanlışlıkla Friday olarak yazdım ve sonunda boşluk bıraktım. Ben programın başka bir yerinde selected değişkenini Friday (boşuksuz) kontrol edersem hata alacağım. Aynı zamanda 2 String ifadeyi kontrol etmenin maliyeti daha fazla olacak.

İşte bu noktada devreye Enum ifadeler giriyor. Haftanın günlerini yeniden yazalım;

enum Weekday {
    case monday
    case tuesday
    case wednesday
    case thursday
    case friday
}

Yukarıda çalışma günlerinin 5 durumunu tanımlamış olduk.

var day = Weekday.monday
day = Weekday.tuesday
day = Weekday.friday

day değişkenini sürekli değiştiriyorum fakat yanlış yazma ihtimalim ortadan kalktı. Artık yanlışlıkla Friday (boşluklu) yazmamın imkanı yok.

İlk başta tanımladığımız Weekday enumunu şu şekilde de tanımlayabiliriz.

enum Weekday {
    case monday, tuesday, wednesday, thursday, friday
}

Enum ifadeleri yazarken bir diğer kolaylık ise ilk atamanın ardından kök enum ifadesinin yazılamayabileceğidir.

var day = Weekday.monday
day = .tuesday
day = .friday

day değişkeni ile enum atamasından sonra Weekday tipinde bir enum olacağından her defasında Weekday yazmaya gerek kalmaz.

Bu yazıyı İngilizce olarak da okuyabilirsiniz.
You can also read this article in English.

Bu yazı, SwiftUI Day 3 adresinde bulunan yazılardan kendim için aldığım notları içermektedir. Orjinal dersi takip etmek için lütfen bağlantıya tıklayın.